﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

using Metriks.Parsiranje.Klase;

namespace Metriks.Parsiranje
{
    /************************************************************************/
    /* Ovo baš i nije parser...     
     * funkcija ima obavezno dva parametra tipa int ili double
    /************************************************************************/
    public static class Parser
    {
        private static Dictionary<Func<String, String[]>, Func<String[], LOC>> povezivac = new Dictionary<Func<String, String[]>, Func<String[], LOC>>(){
            { KvaziRegex.matchEmptyLine,TvornicaObjekata.getEmptyLine },
            { KvaziRegex.matchCommentLine, TvornicaObjekata.getComment  },
            { KvaziRegex.matchVarDecl, TvornicaObjekata.getVarDecl },
            { KvaziRegex.matchBeginFunction, TvornicaObjekata.getBeginFunction },
            { KvaziRegex.matchEndFunction, TvornicaObjekata.getEndFunction },
            { KvaziRegex.matchVarInit, TvornicaObjekata.getVarInit},
            { KvaziRegex.matchVarAssign, TvornicaObjekata.getVarAssign },
            { KvaziRegex.matchBeginIf, TvornicaObjekata.getBeginIf },
            { KvaziRegex.matchBeginElsif, TvornicaObjekata.getElsif},
            { KvaziRegex.matchBeginElse, TvornicaObjekata.getBeginElse },
            { KvaziRegex.matchEndif, TvornicaObjekata.getEndif },
            { KvaziRegex.matchEndWhile, TvornicaObjekata.getEndWhile },
            { KvaziRegex.matchBeginWhile, TvornicaObjekata.getBeginWhile},
            { KvaziRegex.matchReturn, TvornicaObjekata.getReturn}
        };

        /// <summary>
        /// Baca invalidoperationexception ako regex ne nađe ništa.
        /// </summary>
        /// <param name="rawText">Linije kôda.</param>
        /// <returns>Rafinirane linije kôda.</returns>
        public static List<LOC> parsiraj(List<String> rawText)
        {
            if (rawText.Count == 0)
                throw new Exception();
            List<LOC> linesOfCode = new List<LOC>();
            foreach (String s in rawText)
            {
                KeyValuePair<Func<String, String[]>, Func<String[], LOC>> odgovarajuci = new KeyValuePair<Func<String, String[]>, Func<String[], LOC>>();
                String[] rezultat = null;
                foreach (var kvp in povezivac)
                {
                    if ((rezultat = kvp.Key.Invoke(s)) != null)
                    {
                        odgovarajuci = kvp;
                        break;
                    }
                }
                if (rezultat == null)
                    throw new Exception(s);
                linesOfCode.Add(odgovarajuci.Value.Invoke(rezultat));
            }

            return linesOfCode;
        }


    }
}
